HTML 实现拼音注音及美化
2024/01/01
这个需求放在五六年前可能实现起来还会麻烦一些,但是现在,主流浏览器都已经支持(并且兼容性良好)用于东亚文字注音的 HTML 标签 <ruby>
。
用法
这一标签的用法十分简单,看如下代码:
<ruby>
汉 <rp>(</rp><rt>han</rt><rp>)</rp> 字 <rp>(</rp><rt>zi</rt><rp>)</rp>
</ruby>
将需要注音的汉字直接放在 <ruby>
下,将拼音写在 <rt>
标签下,<rp>
标签用于兼容不支持 <ruby>
标签的浏览器。
在支持 <ruby>
标签的浏览器下,上面这段 HTML 代码看起来会像这样:
在不支持 <ruby>
标签的浏览器下,上面这段 HTML 代码看起来会像这样:
拼音位置偏移
你可能会发现,上面的拼音渲染中,拼音的位置有些偏移,这是由于 HTML 空白字符的影响。让我们删除 HTML 代码中的空格和换行,再看看效果:
<ruby>汉<rp>(</rp><rt>han</rt><rp>)</rp>字<rp>(</rp><rt>zi</rt><rp>)</rp></ruby>
现在,拼音便能完美的对应上相应字符的位置了。
美化
我们将上面的 HTML 代码进行修改,添加一些元素(为了让代码可读性更强,添加了换行和空格,实际使用中应删去):
<ruby>
<span class="notation-container">
<span>ming tian</span>
</span>
<span class="text-container">
<span>明天</span>
</span>
<rp>(</rp>
<rt>ming tian</rt>
<rp>)</rp>
</ruby>
在添加 CSS 代码:
.notation-container span,
.text-container span {
/* 避免文字换行影响动画效果 */
white-space: nowrap;
min-width: 0;
}
.notation-container {
/* 使用 grid,实现宽度从零到自动的变化 */
display: grid;
grid-template-columns: 0fr;
opacity: 0;
user-select: none; /* 不让该元素中的文字被选择 */
transition: .3s .15s;
}
.notation-container span {
min-width: 0;
}
.text-container {
/* 使用 grid,实现宽度从零到自动的变化 */
display: grid;
grid-template-columns: 1fr;
opacity: 1;
transition: .3s;
}
.text-container span {
min-width: 0;
}
ruby rt {
position: relative;
top: 0;
transition: .3s;
}
ruby:hover rt {
/* 这两行用于使 `rt` 元素上下移动,由于浏览器表现不同,使用不同代码实现。 */
top: 2em; /* 用于 Firefox */
transform: translateY(2em); /* 用于 Chrome/Edge */
opacity: 0;
}
ruby:hover .text-container {
/* 隐藏被注音的文字 */
grid-template-columns: 0fr;
opacity: 0;
}
ruby:hover .notation-container {
/* 展现拼音 */
grid-template-columns: 1fr;
opacity: 1;
}
效果如下👇,你可以放上鼠标试一试